const strats = {}
const LIFECYCLE = [
  'beforeCreate',
  'created'
]

LIFECYCLE.forEach(hook => {
  strats[hook] = function (p, c) {
    if (c) {
      if (p) {
        return p.concat(c) // c 有 p 有，合并
      } else {
        return [c] // c 有，p 没有，将 c 包装成数组
      }
    } else {
      return p // c 没有 p 有
    }
  }
})

strats.components = function (parentVal, childVal) {
  const res = Object.create(parentVal)

  if (childVal) {
    for (const key in childVal) {
      res[key] = childVal[key] // 返回的是构造的对象，可以拿到父亲原型上的属性，并且将儿子的都拷贝到自己身上
    }
  }

  return res
}

export function mergeOptions (parent, child) {
  const options = {}

  for (const key in parent) {
    mergeField(key)
  }

  for (const key in child) {
    if (!parent.hasOwnProperty(key)) {
      mergeField(key)
    }
  }

  function mergeField (key) {
    // 使用策略模式，减少 if / else
    if (strats[key]) {
      options[key] = strats[key](parent[key], child[key])
    } else {
      // 优先使用child，再采用 parent
      options[key] = child[key] || parent[key]
    }
  }

  return options
}